package br.com.controlador;

import br.com.modelo.*;
import br.com.nfe.CalculaImposto;
import br.com.nfe.DadosNfeController;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.primefaces.event.SelectEvent;
import util.Biblioteca;
import util.JPAUtil;
import util.JSFUtil;

/**
 *
 * @author gilberto.costa
 */
@ManagedBean
@SessionScoped
public class DigitaNfeControler implements Serializable {

    private NfeCabecalho nfe;
    private NfeDetalhe nfeDetalhe;
    private List<NfeCabecalho> listNfe;
    private Produto produto;
    private List<Produto> listProduto;
    private List<Cliente> listcliente;
    private String txt1;
    private String txt2;
    private List<Empresa> listEmpresa;

    @PostConstruct
    public void init() {
        nfe = new NfeCabecalho();
        nfeDetalhe = new NfeDetalhe();
        produto = new Produto();
        listEmpresa = JPAUtil.buscarTodos(Empresa.class);
        if (listEmpresa.size() > 0) {
            nfe.setEmpresa(listEmpresa.get(0));
        }
        nfe.setNumero(NfeCabecalho.retornaUltimoNumeroNota());
    }

    public NfeCabecalho getNfe() {
        return nfe;
    }

    public void setNfe(NfeCabecalho nfe) {
//        nfe.setEmpresa((Empresa) JPAUtil.buscarPorId(Empresa.class, nfe.getEmpresa().getId()));
        this.nfe = nfe;
    }

    public NfeDetalhe getNfeDetalhe() {
        return nfeDetalhe;
    }

    public void setNfeDetalhe(NfeDetalhe nfeDetalhe) {
        this.nfeDetalhe = nfeDetalhe;
    }

    public List<NfeCabecalho> getListNfe() {
        return listNfe;
    }

    public void setListNfe(List<NfeCabecalho> listNfe) {
        this.listNfe = listNfe;
    }

    public Produto getProduto() {
        return produto;
    }

    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    public List<Produto> getListProduto() {
        return listProduto;
    }

    public void setListProduto(List<Produto> listProduto) {
        this.listProduto = listProduto;
    }

    public String getTxt1() {
        return txt1;
    }

    public void setTxt1(String txt1) {
        this.txt1 = txt1;
    }

    public String getTxt2() {
        return txt2;
    }

    public void setTxt2(String txt2) {
        this.txt2 = txt2;
    }

    public List<String> complete(String query) {
        setListProduto(Produto.retornaProdutos());
        List<String> r = new ArrayList<String>();
        for (Produto v : getListProduto()) {
            if (v.getDescricao().toUpperCase().contains(query.toUpperCase())
                    || v.getGtin().toString().contains(query.toString().trim())
                    || v.getCodigoInterno().contains(query.toString().trim())) {
                r.add(v.getGtin() + " - " + v.getDescricao());
            }
        }
        return r;
    }

    public List<String> completeCliente(String query) {
        setListcliente(JPAUtil.buscarTodos(Cliente.class));
        List<String> r = new ArrayList<String>();
        for (Cliente c : getListcliente()) {
            if (c.getNome().toUpperCase().contains(query.toUpperCase())
                    || c.getFantasia().toString().contains(query.toString().trim())
                    || c.getCpfCnpj().contains(query.toString().trim())) {
                r.add(c.getNome() + " - " + c.getFantasia());
            }
        }
        return r;
    }

    public void handleSelect(SelectEvent event) {
        Boolean achou = false;
        for (Produto p : getListProduto()) {
            String decricao = event.getObject().toString().substring((event.getObject().toString().indexOf("-") + 2), event.getObject().toString().length());
            if (p.getDescricao().toString().toUpperCase().equalsIgnoreCase(decricao.toUpperCase())) {
                setProduto(p);
                achou = true;
                break;
            }
        }
        if (!achou) {
            produto = new Produto();
        }
    }

    public void handleSelectCliente(SelectEvent event) {
        Boolean achou = false;
        for (Cliente p : getListcliente()) {
            String decricao = event.getObject().toString().substring(0, (event.getObject().toString().indexOf("-") - 1));
            if (p.getNome().toString().toUpperCase().equalsIgnoreCase(decricao.toUpperCase())) {
                nfe.setCliente(p);
                achou = true;
                break;
            }
        }
        if (!achou) {
            produto = new Produto();
        }
    }

    public void retornProdutoPorCodigo() {
        Produto p = Produto.retornaProdutoPorGtinOuCodInterno(getProduto().getGtin(), getProduto().getGtin());
        if (p != null) {
            setProduto(p);
            setTxt1(p.getDescricao());
        } else {
            produto = new Produto();
            setTxt2(new String());
        }
    }

    public void adicionaItem() {
        if (nfeDetalhe.getQuantidadeComercial().intValue() <= 0) {
            JSFUtil.addMessageErro("A quantidade deve ser maior que 0");
        } else if (produto.getGtin().toString().equalsIgnoreCase("")) {
            JSFUtil.addMessageErro("Informe um produto!!");
        } else {
            NfeDetalhe det = new NfeDetalhe();
            det.setIdNfeCabecalho(nfe);
            det.setQuantidadeComercial(nfeDetalhe.getQuantidadeComercial());
            det.setValorUnitarioComercial(produto.getValorVenda());
            det.setValorTotal(produto.getValorVenda().multiply(det.getQuantidadeComercial()));
            det.setProduto(produto);
            det.setUnidadeComercial(produto.getIdUnidadeProduto().getNome());
            det.setValorIcms(new BigDecimal(10));
            det.setValorIpi(new BigDecimal(10));

            det.setCsosn("0" + det.getProduto().getCst());
            det.setCstIcms(det.getProduto().getCst());
            det.setNumeroItem(nfe.getNfeDetalheList().size());
            det.setCfop(5102);

            nfe.getNfeDetalheList().add(det);
            //atrualizando o tatol dos produtos
            BigDecimal novoValor = nfe.getValorTotalProdutos().add(det.getQuantidadeComercial().multiply(produto.getValorVenda()));
            nfe.setValorTotalProdutos(novoValor);
            nfe.setValorTotal(novoValor);
            nfe.setVenda(null);

            //inicializando objetosd
//            nfe = new NfeCabecalho();
            nfeDetalhe.setQuantidadeComercial(new BigDecimal(1));
            produto = new Produto();
            txt1 = new String();
        }
    }

    public void salvarNota() {
        try {
            nfe.setNumero(NfeCabecalho.retornaUltimoNumeroNota());
            SimpleDateFormat formatoData = new SimpleDateFormat("yyMM");
            String chave = nfe.getEmpresa().getCodigoIbgeCidade().substring(0, 2) //  2
                    + formatoData.format(new Date()) //  4 
                    + nfe.getEmpresa().getCnpj() // 14 
                    + nfe.getCodigoModelo()//nmodelo                      //  2
                    + nfe.getSerie()//serie nota                          //  3 
                    + nfe.getNumero()//numero                             //  9
                    + "1" //  1 
                    + nfe.getCodigoNumerico();//codigo numero             //  8
            Integer digitaChave = Biblioteca.modulo11(chave);             //  1

            nfe.setChaveAcesso(chave + digitaChave.toString());
            nfe.setDigitoChaveAcesso(digitaChave.toString());

            nfe = CalculaImposto.efetuaCalculosDetalhe(nfe.getNfeDetalheList(), nfe.getEmpresa().getCrt(), false, nfe);

            nfe.setCodigoNumerico("00000001");
            nfe.setNaturezaOperacao("Venda de Mercadoria");
            nfe.setIndicadorFormaPagamento('0');
            nfe.setCodigoModelo("55");
            nfe.setSerie("000");
            nfe.setDataEntradaSaida(new Date());
            nfe.setDataEmissao(new Date());
            nfe.setTipoEmissao('1');
            nfe.setVersaoProcessoEmissao(100);
            nfe.setFinalidadeEmissao('1');
            nfe.setTipoOperacao('1');
            nfe.setFormatoImpressaoDanfe('1');
            nfe.setBaseCalculoIcmsSt(BigDecimal.ZERO);
            nfe.setValorIcmsSt(BigDecimal.ZERO);
            nfe.setValorFrete(BigDecimal.ZERO);
            nfe.setValorSeguro(BigDecimal.ZERO);
            nfe.setValorDesconto(BigDecimal.ZERO);
            nfe.setValorIpi(BigDecimal.ZERO);
            nfe.setValorDespesasAcessorias(BigDecimal.ZERO);
            nfe.setCodigoMunicipio(Integer.parseInt(nfe.getCliente().getIdCidade().getCodIBGE().substring(0, 2)));
            //enviando a nf-e
            DadosNfeController dadosNfeControl = new DadosNfeController();
            dadosNfeControl.enviaNfe(nfe);

            nfe = nfe.salvar();
            JSFUtil.addMessageErro("Nota salva!!");
        } catch (Exception e) {
            JSFUtil.addMessageErro("Erro ao salvar Nota!!" + e);
        }
    }

    public void inicializaObj() {
        nfe = new NfeCabecalho();
        nfeDetalhe = new NfeDetalhe();
        txt1 = new String();
        txt2 = new String();
        produto = new Produto();
        if (listEmpresa.size() > 0) {
            nfe.setEmpresa(listEmpresa.get(0));
        }
    }

    public void setaEmpresa() {
        Empresa empr = JPAUtil.buscarPorId(Empresa.class, getNfe().getEmpresa().getId());
        nfe.setEmpresa(empr);
    }

    /**
     * @return the listcliente
     */
    public List<Cliente> getListcliente() {
        return listcliente;
    }

    /**
     * @param listcliente the listcliente to set
     */
    public void setListcliente(List<Cliente> listcliente) {
        this.listcliente = listcliente;
    }
}
